/*******************************************************************************
 * Package: com.song.boot.springstudy.thread
 * Type:    Join
 * Date:    2024-02-05 14:21
 *
 * Copyright (c) 2024 LTD All Rights Reserved.
 *
 * You may not use this file except in compliance with the License.
 *******************************************************************************/
package com.song.boot.springstudy.thread.join;


import java.util.concurrent.TimeUnit;

/**
 * 功能描述： 明白 线程. start 和join  在那个线程中，就让那个线程等待。先执行当前X.join线程，然后才是那个线程     （b中先等待，a执行完）
 * X.join() → “当前线程等 X 做完，再继续”，和其他线程无关。
 * 主线程等待  x.join线程 执行完  主线程再继续
 * 结果：
 * 主线程start
 * B线程状态：RUNNABLE
 * A线程状态：TIMED_WAITING
 * B
 * B线程状态：RUNNABLE
 * 主线程end
 * B线程状态end：RUNNABLE
 * A
 * @author Songxianyang
 * @date 2024-02-05 14:21
 */
public class Join4 {
    public static void main(String[] args) throws Exception {
        System.out.println("主线程start");
        Thread threadA = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A");
        });
        Thread threadB = new Thread(() -> {
            System.out.println("B线程状态："+Thread.currentThread().getState());// 运行态

            // b等待着a先执行完
            try {
                threadA.start();
                threadA.join(1000); // 我只等1秒，然后B线程开始执行
                System.out.println("A线程状态："+threadA.getState());// 终止
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B");
            System.out.println("B线程状态："+Thread.currentThread().getState());// 运行态
        });

        threadB.start();
        threadB.join();



        System.out.println("主线程end");
        System.out.println("B线程状态end："+threadB.currentThread().getState());

    }
}

